Allow __gpfn_to_mfn() to automatically deal with translated domains != current.
authorMichael.Fetterman@cl.cam.ac.uk <Michael.Fetterman@cl.cam.ac.uk>
Mon, 28 Nov 2005 14:09:44 +0000 (15:09 +0100)
committerMichael.Fetterman@cl.cam.ac.uk <Michael.Fetterman@cl.cam.ac.uk>
Mon, 28 Nov 2005 14:09:44 +0000 (15:09 +0100)
Renamed gpfn_to_mfn_foreign() to get_mfn_from_pfn_foreign(), making it more
consistent with get_mfn_from_pfn().

xen/arch/x86/shadow32.c
xen/arch/x86/shadow_public.c
xen/common/grant_table.c
xen/include/asm-x86/shadow.h
xen/include/xen/perfc_defn.h

index bcbbdd5cc22721a0f1f6f05edb6aadf0fd8ef8f0..132a4a148688005b124a1faa50b03fb7e8ab5293 100644 (file)
@@ -1423,7 +1423,7 @@ int shadow_mode_control(struct domain *d, dom0_shadow_control_t *sc)
 }
 
 unsigned long
-gpfn_to_mfn_foreign(struct domain *d, unsigned long gpfn)
+get_mfn_from_pfn_foreign(struct domain *d, unsigned long gpfn)
 {
     unsigned long va, tabpfn;
     l1_pgentry_t *l1, l1e;
@@ -1431,7 +1431,7 @@ gpfn_to_mfn_foreign(struct domain *d, unsigned long gpfn)
 
     ASSERT(shadow_mode_translate(d));
 
-    perfc_incrc(gpfn_to_mfn_foreign);
+    perfc_incrc(get_mfn_from_pfn_foreign);
 
     va = gpfn << PAGE_SHIFT;
     tabpfn = pagetable_get_pfn(d->arch.phys_table);
index 36454f9e51135093ef3b8a8c98fc43dc5f95ba63..5d7d5b78444857754e687df2e449dc6dc4b32b99 100644 (file)
@@ -1607,7 +1607,7 @@ remove_shadow(struct domain *d, unsigned long gpfn, u32 stype)
 }
 
 unsigned long
-gpfn_to_mfn_foreign(struct domain *d, unsigned long gpfn)
+get_mfn_from_pfn_foreign(struct domain *d, unsigned long gpfn)
 {
     unsigned long va, tabpfn;
     l1_pgentry_t *l1, l1e;
@@ -1615,7 +1615,7 @@ gpfn_to_mfn_foreign(struct domain *d, unsigned long gpfn)
 
     ASSERT(shadow_mode_translate(d));
 
-    perfc_incrc(gpfn_to_mfn_foreign);
+    perfc_incrc(get_mfn_from_pfn_foreign);
 
     va = gpfn << PAGE_SHIFT;
     tabpfn = pagetable_get_pfn(d->arch.phys_table);
index 97b3ca0aa0017f094ee24948c63a9761c91411f9..c2c15c7e593e64cafa64eda38cf8ea00433f59fc 100644 (file)
@@ -234,7 +234,7 @@ __gnttab_map_grant_ref(
 
         /* rmb(); */ /* not on x86 */
 
-        frame = __gpfn_to_mfn_foreign(rd, sha->frame);
+        frame = __gpfn_to_mfn(rd, sha->frame);
 
         if ( unlikely(!pfn_valid(frame)) ||
              unlikely(!((dev_hst_ro_flags & GNTMAP_readonly) ?
index 05544a8bcd4b93cbd1712169b7501cc1bfa8d5f9..58ecca6989aece2f5a80aac5c19858f9f22c882e 100644 (file)
@@ -285,22 +285,19 @@ static inline void shadow_mode_disable(struct domain *d)
 
 #define __mfn_to_gpfn(_d, mfn)                         \
     ( (shadow_mode_translate(_d))                      \
-      ? get_pfn_from_mfn(mfn)                                   \
+      ? get_pfn_from_mfn(mfn)                          \
       : (mfn) )
 
 #define __gpfn_to_mfn(_d, gpfn)                        \
     ({                                                 \
-        (shadow_mode_translate(_d))                    \
-        ? get_mfn_from_pfn(gpfn)                \
+        unlikely(shadow_mode_translate(_d))            \
+        ? (likely(current->domain == (_d))             \
+           ? get_mfn_from_pfn(gpfn)                    \
+           : get_mfn_from_pfn_foreign(_d, gpfn))       \
         : (gpfn);                                      \
     })
 
-#define __gpfn_to_mfn_foreign(_d, gpfn)                \
-    ( (shadow_mode_translate(_d))                      \
-      ? gpfn_to_mfn_foreign(_d, gpfn)                  \
-      : (gpfn) )
-
-extern unsigned long gpfn_to_mfn_foreign(
+extern unsigned long get_mfn_from_pfn_foreign(
     struct domain *d, unsigned long gpfn);
 
 /************************************************************************/
@@ -871,18 +868,7 @@ static inline void hl2e_propagate_from_guest(
 
     if ( l2e_get_flags(gpde) & _PAGE_PRESENT )
     {
-        if ( unlikely((current->domain != d) && !shadow_mode_external(d)) )
-        {
-            // Can't use __gpfn_to_mfn() if we don't have one of this domain's
-            // page tables currently installed.
-            // This isn't common -- it only happens during shadow mode setup
-            // and mode changes.
-            //
-            mfn = gpfn_to_mfn_foreign(d, pfn);
-        }
-        else
-            mfn = __gpfn_to_mfn(d, pfn);
-
+        mfn = __gpfn_to_mfn(d, pfn);
         if ( VALID_MFN(mfn) && (mfn < max_page) )
             hl2e = l1e_from_pfn(mfn, __PAGE_HYPERVISOR);
     }
index 5326f3bdbc85a8cc8dde54dfd5ecffb9df2971e5..1e6820acadb9015cc5c119313240438e08c33a0d 100644 (file)
@@ -114,7 +114,7 @@ PERFCOUNTER_CPU(shadow_get_page_fail,   "shadow_get_page_from_l1e fails")
 PERFCOUNTER_CPU(validate_hl2e_calls,    "calls to validate_hl2e_change")
 PERFCOUNTER_CPU(validate_hl2e_changes,  "validate_hl2e makes changes")
 PERFCOUNTER_CPU(exception_fixed,        "pre-exception fixed")
-PERFCOUNTER_CPU(gpfn_to_mfn_foreign,    "calls to gpfn_to_mfn_foreign")
+PERFCOUNTER_CPU(get_mfn_from_pfn_foreign, "calls to get_mfn_from_pfn_foreign")
 PERFCOUNTER_CPU(remove_all_access,      "calls to remove_all_access")
 PERFCOUNTER_CPU(remove_write_access,    "calls to remove_write_access")
 PERFCOUNTER_CPU(remove_write_access_easy, "easy outs of remove_write_access")